//
//  NetWorkManager.swift
//  MQLWeibo
//
//  Created by MQL-IT on 2016/11/9.
//  Copyright © 2016年 MQL-IT. All rights reserved.
//

import UIKit
import AFNetworking //导入框架文件夹的名字

/// swift枚举支持任意类型,OC中只支持整数
enum MITHTTPMethod {
    case GET
    case POST
}

/// 网络管理工具  Cannot convert value of type '(URLSessionDataTask, AnyObject?) -> ()' to expected argument type '((URLSessionDataTask, Any?) -> Void)?'
class NetWorkManager: AFHTTPSessionManager {
    /// 静态区/常量/闭包/
    /// 在第一次访问时执行闭包并且将结果保存在 shared常量中
    static let shared: NetWorkManager = {
        //实例化
        let instance = NetWorkManager()
        //设置响应反序列化支持的数据类型
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        
        return instance
    }()
    
    lazy var userAccount = UserAccount()
//    /// 访问令牌,所有网络请求都基于此令牌(登录除外)期
//    // 为了保证用户信息安全,token的默认有效期限是3天
//    var accessToken: String? //= "2.00Oly1mCX_tNCE9fe4649cb5xPpGwB"
//    /// 用户微博 id
//    var uid: String? = "2546529920"
    
    /// 登录标记,计算型属性
    var userLogin: Bool {
        return userAccount.access_token != nil
    }
    
    
    /// 专门负责拼接token的网络请求方法
    func tokenRequest(method: MITHTTPMethod = .GET, URLString: String, parameters: [String:AnyObject]?, completion: @escaping (_ json: Any?, _ isSuccess: Bool) -> ()) {
        
        // 处理token字典
        // 0> 判断token是否存在,不存在直接返回.程序执行中,一般token不为nil
        // 对于测试用户,每天的刷新量是有限的,超出上限,会被锁定一段时间
        guard let token = userAccount.access_token else {
            
            
            printLog(message: "没有token,需要登录")
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: userShouldLoginNotification), object: nil)
            
            completion(nil, false)
            return
        }
        //1> 判断参数字典是否存在,如果为nil创建字典
        var parameters = parameters
        if parameters == nil {
            parameters = [String: AnyObject]()
        }
        //2> 设置参数字典,代码在此处,字典一定有值
        parameters!["access_token"] = token as AnyObject?
        //调用request发起真正的网络请求
        request(URLString: URLString, parameters: parameters, completion: completion)
    }
    
    
    /// 使用一个函数封装AFN的 get 和 post 请求
    func request(method: MITHTTPMethod = .GET, URLString: String, parameters: [String:AnyObject]?, completion: @escaping (_ json: Any?, _ isSuccess: Bool) -> ()) {
        
        let success = {(task: URLSessionDataTask, json: Any?) -> Void in
            completion(json, true)
        }
        let failure = {(task: URLSessionDataTask?, error: Error) in
            // error 通常比较吓人,一般不让用户看到
            // 针对403处理用户token过期
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                printLog(message: "token过期了")
                // 发送通知(本方法不知道谁调用,谁接收到通知谁处理,提示进行登录)
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: userShouldLoginNotification), object: nil)
            }
            printLog(message: "网络请求错误\(error)")
            completion(nil, false)
        }
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        } else {
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
        
        
    }
}
